package com.tinchos.core.persistencia;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import com.tinchos.core.excepciones.PersistenceException;
import com.tinchos.entidades.Estudiante;

public class EstudianteDAO implements DAO {
	
	
	public Estudiante cargarEstudiante(String nombre) throws PersistenceException  {
		
		String archivoACargar = "./Data/Estudiantes/" + nombre + ".xml"; 
		SAXBuilder builder = new SAXBuilder();
		
		Document doc = null;
		Element root = null;
		
		try {
			doc = builder.build(new FileInputStream(archivoACargar));
		} catch (JDOMException e) {
			//TODO crear excepciones
			e.printStackTrace();
			System.out.println("Error1");
		} catch (IOException e) {
			//TODO crear excepciones
			e.printStackTrace();
			System.out.println("Error2");
		}
		if (doc == null) {
			System.out.println("null3!!"); 
			System.exit(1);
		}
		root = doc.getRootElement();
		return getEstudiante(root);
		
	}
	
	/* Instancia a partir de NodoXML */
	private Estudiante getEstudiante(Element nodo) throws PersistenceException {
		
		Estudiante estudiante = new Estudiante();
		CarreraDAO daoCarrera = (CarreraDAO) DAOFactory.getDAO("com.tinchos.entidades.Carrera");
			
		estudiante.setNombre(nodo.getAttributeValue("nombre"));
		estudiante.setCarrera(daoCarrera.getCarrera(nodo.getChild("carrera")));

		return estudiante;
		
	}
	
	/* NodoXML a partir de instancia */
	public boolean guardarEstudiante(Estudiante estudiante) throws PersistenceException {
		
		CarreraDAO daoCarrera = (CarreraDAO) DAOFactory.getDAO("com.tinchos.entidades.Carrera");
		
		/* Creamos el elemento root */
		Element root = new Element("estudiante");
		
		root.setAttribute(new Attribute("nombre", estudiante.getNombre()));
		root.addContent(daoCarrera.obtenerNodo(estudiante.getCarrera()));
		
		/* Creamos el documento */
		Document doc = new Document(root);
		
		/* Lo almacenamos en un fichero dado por argumento */
		try {
			String nombreArchivo = "./Data/Estudiantes/" + estudiante.getNombre() + ".xml";
			
			XMLOutputter salidaXml = new XMLOutputter(Format.getPrettyFormat());
			
			new File(nombreArchivo).createNewFile();
			FileOutputStream archivo = new FileOutputStream(nombreArchivo);
			
			salidaXml.output(doc, archivo);
			
			archivo.flush();
			archivo.close();
			
			return true;
			
		} catch (Exception e) {
			
			System.out.println("ERROR terrible");
			throw new PersistenceException();
		}
		
	}
	
	
}
